package com.slwish.xty.utils;


import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.location.LocationManager;
import android.provider.Settings;
import android.view.View;

import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.InfoWindow;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.Marker;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.search.route.DrivingRoutePlanOption;
import com.baidu.mapapi.search.route.PlanNode;
import com.baidu.mapapi.search.route.RoutePlanSearch;
import com.baidu.mapapi.search.route.TransitRoutePlanOption;
import com.baidu.mapapi.search.route.WalkingRoutePlanOption;


/**
 * 地图工具类
 * 创 建 人:徐晓健
 * 创建时间: 2015年8月5日
 * 修 改 人:徐晓健（2015年8月5日）
 *
 */
public class MapUtils {
    /**
     * 行车
     */
    public static final int DRIVE_LINE = 0;
    /**
     * 公交
     */
    public static final int BUS_LINE = 1;
    /**
     * 步行
     */
    public static final int WALK_LINE = 2;

    /**
     *  设置定位
     *
     *  mBaiduMap地图操作类
     * @param context 上下文
     * @param mlistener 定位监听
     * @param time 定位时间间隔
     * @return 定位对象
     * 创建人:徐晓健(2015年8月5日)
     * 修改人:徐晓健(2015年8月18日)
     * 添加返回值LocationClient
     */
    public static LocationClient startLocation(Context context,
                                               BDLocationListener mlistener, int time) {
        // TODO Auto-generated method stub
        LocationClient location = new LocationClient(context);
        LocationClientOption option = new LocationClientOption();
        option.setOpenGps(true);
        option.setCoorType("bd09ll"); // 设置坐标类型
        option.setScanSpan(time);
        option.setIsNeedAddress(true);
        location.registerLocationListener(mlistener);
        location.setLocOption(option);
        location.start();
        return location;
    }


    /**
     * TODO 默认定位设置
     * @param mBaiduMap 地图操作类
     * @param context 上下文
     * @param mlistener  定位监听
     * @return 定位对象
     * 创建人:徐晓健(2015年8月5日)
     * 修改人:徐晓健(2015年8月18日)
     * 添加返回值LocationClient
     */
    public static LocationClient startLocation(BaiduMap mBaiduMap, Context context,
                                               BDLocationListener mlistener) {
        return startLocation(mBaiduMap, context, mlistener, 3000,"bd09ll");
    }

    /**
     * TODO 默认定位设置
     * @param mBaiduMap 地图操作类
     * @param context 上下文
     * @param mlistener  定位监听
     * @return 定位对象
     * 创建人:徐晓健(2015年8月5日)
     * 修改人:徐晓健(2015年8月18日)
     * 添加返回值LocationClient
     */
    public static LocationClient startLocation(BaiduMap mBaiduMap, Context context,
                                               BDLocationListener mlistener,String modle) {
        return startLocation(mBaiduMap, context, mlistener, 3000,modle);
    }

    /**
     * TODO 默认定位设置
     * @param context 上下文
     * @param mlistener  定位监听
     * @return 定位对象
     * 创建人:徐晓健(2015年8月5日)
     * 修改人:徐晓健(2015年8月18日)
     * 添加返回值LocationClient
     */
    public static LocationClient startLocation(Context context,
                                               BDLocationListener mlistener) {
        return startLocation(context, mlistener, 3000);
    }

    /**
     *  设置定位
     *
     * @param mBaiduMap 地图操作类
     * @param context 上下文
     * @param mlistener 定位监听
     * @param time 定位时间间隔
     * @return 定位对象
     * 创建人:徐晓健(2015年8月5日)
     * 修改人:徐晓健(2015年8月18日)
     * 添加返回值LocationClient
     */
    public static LocationClient startLocation(BaiduMap mBaiduMap, Context context,
                                               BDLocationListener mlistener, int time,String modle) {
        // TODO Auto-generated method stub
        LocationClient location = new LocationClient(context);
        LocationClientOption option = new LocationClientOption();
        option.setOpenGps(true);
        option.setCoorType(modle); // 设置坐标类型
        option.setScanSpan(time);
        option.setIsNeedAddress(true);
        location.registerLocationListener(mlistener);
        location.setLocOption(option);
        location.start();
        return location;
    }




    /**
     *  关闭定位
     * @param listener 定位监听
     * @param location 定位对象
     * 创建人:徐晓健(2015年8月5日)
     * 修改人:徐晓健(2015年8月18日)
     * 添加传入参数
     */
    public static void stopLocation(BDLocationListener listener,LocationClient location) {
        if (location != null) {
            location.stop();
            location.unRegisterLocationListener(listener);
            location=null;
        }
    }

    /**
     *
     * 移动地图中心的区域
     * xuxj
     * @param mBaiduMap 地图操作类
     * @param latlng 显示中心点的坐标
     * @param zoomSize 缩放尺寸
     *
     */
    public static void movePosition(LatLng latlng, BaiduMap mBaiduMap,
                                    float zoomSize) {
        if (latlng != null) {
//            MapStatus ms = new MapStatus.Builder().zoom(zoomSize)
//                    .target(latlng).build();
//            MapStatusUpdate mss = MapStatusUpdateFactory.newMapStatus(ms);
//            mBaiduMap.animateMapStatus(mss, 1000);

            MapStatus.Builder builder = new MapStatus.Builder();
            builder.target(latlng).zoom(18.0f);
            mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
        }
    }

    /**
     * 移动地图中心的区域（默认尺寸）
     * @param mBaiduMap 地图操作类
     * @param latlng  显示中心点的坐标
     * 创建人:徐晓健(2015年8月5日)
     * 修改人:
     */
    public static void movePosition(LatLng latlng, BaiduMap mBaiduMap) {
        movePosition(latlng, mBaiduMap, 19);
    }

    /**
     * 自己所在位置的点
     * @param mBaiduMap 地图操作类
     * @param latlng 自己所在的点
     * @param radius 半径
     * @param direction 方向
     * 创建人:徐晓健(2015年8月5日)
     * 修改人:
     */
    public static void setLocData(LatLng latlng, BaiduMap mBaiduMap,
                                  float radius, float direction) {
        MyLocationData locData = new MyLocationData.Builder().accuracy(radius)
                .direction(direction).latitude(latlng.latitude)
                .longitude(latlng.longitude).build();
        mBaiduMap.setMyLocationData(locData);
        mBaiduMap.setMyLocationEnabled(true);
    }

    /**
     * 自己所在位置的点
     * @param mBaiduMap 地图操作类
     * @param latlng 自己所在的点
     * @param radius 半径
     * @param direction 方向
     * @param isMove 是否移动
     * 创建人:徐晓健(2015年8月5日)
     * 修改人:
     */
    public static void movePositionAndSetLocData(LatLng latlng,
                                                 BaiduMap mBaiduMap, float radius, float direction, boolean isMove) {
        setLocData(latlng, mBaiduMap, radius, direction);
        if (isMove) {
            movePosition(latlng, mBaiduMap);
        }
    }

    /**
     * 在地图上用图片标注点
     * @param mBaiduMap 地图操作类
     * @param bitmap  用于标注的 图片
     * @param latlng 标注点
     * @return Marker
     * 创建人:徐晓健(2015年8月5日)
     * 修改人:
     */
    public static Marker getMarker(BaiduMap mBaiduMap, BitmapDescriptor bitmap,
                                   LatLng latlng) {
        mBaiduMap.clear();
        OverlayOptions option = new MarkerOptions().icon(bitmap).position(
                latlng);
        Marker mark = (Marker) mBaiduMap.addOverlay(option);
        return mark;
    }


    /**
     * 在地图上用图片标注点
     * @param mBaiduMap 地图操作类
     * @param bitmapId  用于标注的 图片
     * @param latlng 标注点
     * @return marker对象
     * 创建人:徐晓健(2015年8月5日)
     * 修改人:
     */
    public static Marker getMarker(BaiduMap mBaiduMap, int bitmapId,
                                   LatLng latlng) {
        BitmapDescriptor sign = BitmapDescriptorFactory.fromResource(bitmapId);
        return getMarker(mBaiduMap, sign, latlng);
    }

    /**
     * 移动地图显示的区域并显示点
     * xuxj
     * @param mBaiduMap 地图操作类
     * @param bitmap 用于标注的 图片
     * @param latlng 标注点
     * @param zoomSize  缩放比例
     */
    public static Marker getMarkerAndMove(BaiduMap mBaiduMap, LatLng latlng,
                                          BitmapDescriptor bitmap, float zoomSize) {
        movePosition(latlng, mBaiduMap, zoomSize);
        return getMarker(mBaiduMap, bitmap, latlng);
    }

    /**
     * 移动地图显示的区域并显示点
     * xuxj
     * @param mBaiduMap 地图操作类
     * @param latlng 标注点
     * @param zoomSize 缩放比例
     */
    public static Marker getMarkerAndMove(BaiduMap mBaiduMap, LatLng latlng,
                                          int bitmapId, float zoomSize) {
        movePosition(latlng, mBaiduMap, zoomSize);
        return getMarker(mBaiduMap, bitmapId, latlng);
    }

    /**
     * 移动地图显示的区域并显示点
     * xuxj
     * @param mBaiduMap 地图操作类
     * @param bitmap 用于标注的 图片
     * @param latlng 标注点
     */
    public static Marker getMarkerAndMove(BaiduMap mBaiduMap, LatLng latlng,
                                          BitmapDescriptor bitmap) {
        return getMarkerAndMove(mBaiduMap, latlng, bitmap, 17);
    }

    /**
     * 移动地图显示的区域并显示点
     * xuxj
     * @param mBaiduMap 地图操作类
     * @param bitmapId 用于标注的 图片
     * @param latlng 标注点
     */
    public static Marker getMarkerAndMove(BaiduMap mBaiduMap, LatLng latlng,
                                          int bitmapId) {

        return getMarkerAndMove(mBaiduMap, latlng, bitmapId, 19);
    }



    /**
     * 线路搜索
     * xuxj
     * @param mPlanSearch 搜索操作类
     * @param context 上下文
     * @param start 开始地点
     * @param end 终点
     * @param whatLine 方式
     */
    public static void searchLine(RoutePlanSearch mPlanSearch, Context context,
                                  String cityName,String start, String end, int whatLine) {

        PlanNode startNode = PlanNode.withCityNameAndPlaceName(cityName, start);
        PlanNode endNode = PlanNode.withCityNameAndPlaceName(cityName, end);
        switch (whatLine) {
            case DRIVE_LINE:
                mPlanSearch.drivingSearch(new DrivingRoutePlanOption().from(
                        startNode).to(endNode));
                break;
            case BUS_LINE:
                mPlanSearch.transitSearch(new TransitRoutePlanOption()
                        .from(startNode).city(cityName).to(endNode));
                break;
            case WALK_LINE:
                mPlanSearch.walkingSearch(new WalkingRoutePlanOption().from(
                        startNode).to(endNode));
                break;
            default:
                break;
        }
    }

    /**
     * 线路搜索
     * xuxj
     * @param mPlanSearch 搜索操作类
     * @param context  上下文
     * @param start 开始地点
     * @param end 终点
     * @param whatLine 方式
     */
    public static void searchLine(RoutePlanSearch mPlanSearch, Context context,
                                  String cityName,  LatLng start, LatLng end, int whatLine) {
//        String cityName = context.getString(R.string.city_name);
        PlanNode startNode = PlanNode.withLocation(start);
        PlanNode endNode = PlanNode.withLocation(end);
        switch (whatLine) {
            case DRIVE_LINE:
                mPlanSearch.drivingSearch(new DrivingRoutePlanOption().from(
                        startNode).to(endNode));
                break;
            case BUS_LINE:
                mPlanSearch.transitSearch(new TransitRoutePlanOption()
                        .from(startNode).city(cityName).to(endNode));
                break;
            case WALK_LINE:
                mPlanSearch.walkingSearch(new WalkingRoutePlanOption().from(
                        startNode).to(endNode));
                break;
            default:
                break;
        }
    }

    /**
     * 显示InfoWindow
     * xuxj
     * @param mBaiduMap 地图操作类
     * @param latlng InfoWindow的点
     * @param high 纵向移动量
     * @param infoWindowView InfoWindow中的View
     */
    public static void showInfoWindow(BaiduMap mBaiduMap, View infoWindowView,
                                      LatLng latlng, int high) {
        mBaiduMap.showInfoWindow(new InfoWindow(infoWindowView, latlng, -high));
    }

    /**
     * 清理地图
     * xuxj
     * @param mBaiduMap 地图操作类
     */
    public static void clearMap(BaiduMap mBaiduMap) {
        mBaiduMap.clear();
        mBaiduMap.hideInfoWindow();
    }

    /**
     *
     * 判断gps是否打开
     * xuxj
     * @param context 上下文
     */
    public static boolean isOPen(Context context) {

        LocationManager locationManager = (LocationManager) context
                .getSystemService(Context.LOCATION_SERVICE);
        // 通过GPS卫星定位，定位级别可以精确到街（通过24颗卫星定位，在室外和空旷的地方定位准确、速度快）
        boolean gps = locationManager
                .isProviderEnabled(LocationManager.GPS_PROVIDER);
        // 通过WLAN或移动网络(3G/2G)确定的位置（也称作AGPS，辅助GPS定位。主要用于在室内或遮盖物（建筑群或茂密的深林等）密集的地方定位）

        return gps;
    }

    /**
     * 获取地图的缩放级别
     * xuxj
     * @param mBaiduMap 地图操作类
     * @return
     */
    public static float getMapZoom(BaiduMap mBaiduMap) {
        return mBaiduMap.getMapStatus().zoom;
    }

    /**
     * 缩放地图
     * xuxj
     * @param mBaiduMap 地图操作类
     * @param zoomSize  缩放尺寸
     */
    public static void zoomMap(BaiduMap mBaiduMap, float zoomSize) {
        MapStatus mapStatus = new MapStatus.Builder().zoom(
                getMapZoom(mBaiduMap) + zoomSize).build();
        MapStatusUpdate mapUpdate = MapStatusUpdateFactory
                .newMapStatus(mapStatus);
        mBaiduMap.animateMapStatus(mapUpdate);
    }


    /**
     *
     * 设置gps
     * xuxj
     * @param mcontext  上下文
     */
    public static void setGpsType(Context mcontext) {
        Intent intent = new Intent();
        intent.setAction(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        try {
            mcontext.startActivity(intent);

        } catch (ActivityNotFoundException ex) {

            intent.setAction(Settings.ACTION_SETTINGS);
            try {
                mcontext.startActivity(intent);
            } catch (Exception e) {
            }
        }
    }
}
